2.4 第三方app对接代码示例

QQ音乐

qq音乐没有sdk,通过广播给qq音乐app发通知就行了。目前没有版本兼容问题,新旧版本都通用,但是新版本的qq音乐app体验会好一些。

示例代码:

public class QQMusicProxy {
    private Context mContext;
    private final static String PULL_FROM = "10026465";

    public void openApp() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=0&pull_from=" + PULL_FROM + "&mb=true";
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    public void exitApp() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=1&pull_from=10026465";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
    }

    public void play() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=0";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
    }

    public void pause() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=1";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
    }

    public void previous() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=2";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
    }

    public void next() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=3";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
    }

    public void collect() {
        if (NetUtils.isNetworkAvailable()) {
             Intent intent = new Intent();
        String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=5";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
        }
    }

    public void unCollect() {
        if (NetUtils.isNetworkAvailable()) {
            Intent intent = new Intent();
        String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=6";
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
        }
    }

    public void setPlayMode(String playMode) {
        Intent intent = new Intent();
        if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_RANDOM)) {
            String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=105";
        } else if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_INORDER)) {
            String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=103";
        } else if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_CIRCLE)) { // QQ音乐没有专门的循环播放模式接口,循环播放和顺序播放是一样的
            String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=103";
        } else if (TextUtils.equals(playMode, MediaProtocol.PlayMode.MODE_SINGLE)) {
            String uri = "qqmusiccar://?action=20&pull_from=10026465&m0=101";
        }
        intent.setData(Uri.parse(uri));
        mContext.sendBroadcast(intent);
    }

    public void searchAndPlayMusic(MusicSearchKey musicSearchKey) {
        // MusicSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
        String keyWord = getMusicKeyWord(musicSearchKey); // getMusicKeyWord()方法在文章最后面定义

        // qq音乐搜索接口
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=8&pull_from=" + PULL_FROM + "&mb=true ";
        try {
            uri += "&search_key=" + URLEncoder.encode(keyWord, "UTF-8") + "&m1=true";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    // 播放qq音乐app中的“本地列表”列表
    public void playLocalList() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=" + 3 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    // 播放qq音乐app中的“车载音乐”列表
    public void playCarMusicList() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=" + 5 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    // 播放qq音乐app中的“车载电台”列表
    public void playCarRadioList() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=" + 6 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    // 播放qq音乐app中的“最近播放”列表
    public void playLatestList() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=" + 2 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }

    // 播放qq音乐app中的“我的音乐”列表
    public void playMyMusicList() {
        Intent intent = new Intent();
        String uri = "qqmusiccar://?action=" + 4 + "&pull_from=" + PULL_FROM + "&m1=true" + "&mb=false";
        intent.setData(Uri.parse(uri));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }
}

酷我音乐

酷我音乐3.x版本需要使用酷我sdk_1.9.3,酷我音乐4.x版本需要使用酷我sdk_1.9.7。这两个sdk主要是搜索接口有一定差异,示例代码基于酷我sdk_1.9.7的。

示例代码

public class KuWoMusicProxy{
    // 这里写客户公司与酷我对接的key
    private final String appKey = "appKey";
    private Context mContext;
    private KWAPI mKwapi;

    public KuWoMusicProxy(Context context) {
        mContext = context;
        mKwapi = KWAPI.createKWAPI(mContext, appKey);

        // 如果需要监听状态的,需要注册如下监听
//        mKwapi.registerPlayerStatusListener(xxx);
//        mKwapi.registerPlayEndListener(xxx);
//        mKwapi.registerExitListener(xxx);
//        mKwapi.setFullScreen(xxx);
    }

    public void openApp(boolean autoPlay) {
        mKwapi.startAPP(autoPlay);
    }

    public void exitApp() {
        mKwapi.exitAPP();
    }

    public void play() {
        mKwapi.setPlayState(PlayState.STATE_PLAY);
    }

    public void pause() {
        mKwapi.setPlayState(PlayState.STATE_PAUSE);
    }

    public void previous() {
        mKwapi.setPlayState(PlayState.STATE_PRE);
    }

    public void next() {
        mKwapi.setPlayState(PlayState.STATE_NEXT);
    }

    public void setPlayMode(String mode) {
        if (mode.equals(MediaProtocol.PlayMode.MODE_CIRCLE)) {//循环播放
            mKwapi.setPlayMode(PlayMode.MODE_ALL_CIRCLE);
        } else if (mode.equals(MediaProtocol.PlayMode.MODE_INORDER)) {//顺序播放
            mKwapi.setPlayMode(PlayMode.MODE_ALL_ORDER);
        } else if (mode.equals(MediaProtocol.PlayMode.MODE_RANDOM)) {//随机播放
            mKwapi.setPlayMode(PlayMode.MODE_ALL_RANDOM);
        } else if (mode.equals(MediaProtocol.PlayMode.MODE_SINGLE)) {//单曲循环
            mKwapi.setPlayMode(PlayMode.MODE_SINGLE_CIRCLE);
        }
    }

    // 播放本地音频文件,path:本地音频文件路径
    public void playLocalMusic(String path) {
        mKwapi.playLocalMusic(path);
    }

    public void searchAndPlayMusic(MusicSearchKey musicSearchKey) {
        // MusicSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
        MusicSearchKey musicSearchKey = new MusicSearchKey(duiData);
        String song = musicSearchKey.getSongName();
        String singer = musicSearchKey.getSingerName();
        String album = musicSearchKey.getAlbum();

        if (TextUtils.isEmpty(song) && TextUtils.isEmpty(singer)) {
            // getMusicKeyWord()方法在文章最后面定义
            String keyWord = MediaHelper.getInstance().getMusicKeyWord(musicSearchKey);
            mKwapi.playClientMusicsByTheme(keyWord);
        } else {
            mKwapi.playClientMusics(song, singer, album);
        }
    }
}

喜马拉雅

喜马拉雅2.x和3.x使用的sdk是一样的,但是有部分接口使用不一样。

喜马拉雅2.x版本示例代码

/*
    {"categoryName":"有声书","categoryId":3},
    {"categoryName":"娱乐","categoryId":4},
    {"categoryName":"相声评书","categoryId":12},
    {"categoryName":"儿童","categoryId":6},
    {"categoryName":"资讯","categoryId":1},
    {"categoryName":"脱口秀","categoryId":28},
    {"categoryName":"情感生活","categoryId":10},
    {"categoryName":"历史","categoryId":9},
    {"categoryName":"人文","categoryId":39},
    {"categoryName":"英语","categoryId":38},
    {"categoryName":"小语种","categoryId":32},
    {"categoryName":"教育培训","categoryId":13},
    {"categoryName":"广播剧","categoryId":15},
    {"categoryName":"戏曲","categoryId":16},
    {"categoryName":"国学书院","categoryId":40},
    {"categoryName":"电台","categoryId":17},
    {"categoryName":"商业财经","categoryId":8},
    {"categoryName":"健康养生","categoryId":7},
    {"categoryName":"旅游","categoryId":22},
    {"categoryName":"汽车","categoryId":21},
    {"categoryName":"动漫游戏","categoryId":24},
    {"categoryName":"电影","categoryId":23},
    {"categoryName":"党课随身听","categoryId":41},
    {"categoryName":"名校公开课","categoryId":30},
    {"categoryName":"时尚生活","categoryId":31},
    {"categoryName":"诗歌","categoryId":34},
    {"categoryName":"段子","categoryId":28}
 * */

public class XmlyProxy{
    // 这里的值记得改为公司与喜马拉雅对接的值
    private static final String APPSECRET = "APPSECRET";
    private static final String APPKEY = "APPKEY";
    private static final String PACKID = "PACKID";

    private Context mContext;
    private SpeechControler mController;

    public XmlyProxy(Context context) {
        mContext = context;
        initController();
    }

    private void initController() {
        try {
            mController = SpeechControler.getInstance(mContext);
            mController.init(APPSECRET, APPKEY, PACKID);
        } catch (Exception e) {
            e.printStackTrace();
            try {
                Intent intent = new Intent();
                intent.setData(Uri.parse("tingcar://open"));
                mContext.startActivity(intent);
            } catch (Exception ex) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mController = SpeechControler.getInstance(mContext);
                        mController.init(APPSECRET, APPKEY, PACKID);
                    }
                }, 2000);
            }
        }
    }

    private void sdkPlayDelay(final long time) {
        ThreadPoolManager.getInstance().addAsyncTask(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mController.play();
            }
        });
    }

    public void openApp(String pkgName, boolean autoPlay) {
        Intent intent = new Intent();
        intent.setData(Uri.parse("tingcar://open"));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);

        // 启动之后自动播放
        sdkPlayDelay(3000);
    }

    public void exitApp(String pkgName) {
        mController.stopAndExitApp();
    }

    public void play() {
        mController.play();
    }

    public void pause() {
        mController.pause();
    }

    public void previous() {
        mController.playPre();
    }

    public void next() {
        mController.playNext();
    }

    public void collect() {
        mController.collectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
    }

    public void unCollect() {
        mController.unCollectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
    }

    public void searchAndPlayRadio(RadioSearchKey radioSearchKey) {
        // RadioSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
        // getRadioKeyWord()方法在文章最后面定义
        String keyword = getRadioKeyWord(radioSearchKey);
        // categoryId由RadioSearchKey中category字段的值,根据开头那个对照表得到
        int categoryId = 12; // 假设category字段的值是"相声",对应的类别是"相声评书",id就是12

        // 喜马拉雅sdk搜索并播放
        mController.getSourseLists(keyword, categoryId, 1, 10, 2, new IMainDataCallback<SearchTrackList>() {
            @Override
            public void successCallBack(SearchTrackList searchTrackList) {
                final List<Track> listAudios = searchTrackList.getTracks();
                if (listAudios != null && listAudios.size() > 0) {
                    mController.playTrackList(listAudios, 0, new IMainDataCallback<String>() {
                        @Override
                        public void successCallBack(String s) {
                        }

                        @Override
                        public void errCallBack(String s) {
                        }
                    });
                }
            }

            @Override
            public void errCallBack(String s) {
            }
        });
    }
}

喜马拉雅3.x版本示例代码

public class XmlyProxy{
    // 这里改为客户公司跟喜马拉雅对接的key
    String secret = "secret";
    String key = "key";
    String id = "id";
    private Context mContext;
    private SpeechControler mController;

    public XmlyProxy(Context context) {
        mContext = context;
        initController();
    }

    private void initController() {
        try {
            String secret = AssetsUtil.readProp(mContext, MusicProtocol.AssetKey.XMLYSECRET);
            String key = AssetsUtil.readProp(mContext, MusicProtocol.AssetKey.XMLYKEY);
            String id = AssetsUtil.readProp(mContext, MusicProtocol.AssetKey.XMLYPACKID);
            mController = SpeechControler.getInstance(mContext);
            mController.init(secret, key, id);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void openApp(boolean autoPlay) {
        Intent intent = new Intent();
        intent.setData(Uri.parse("tingcar://open?to_fragment=to_fragment"));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        mContext.startActivity(intent);
    }

    public void exitApp() {
        mController.stopAndExitApp();
    }

    public void play() {
        mController.play();
    }

    public void pause() {
        mController.pause();
    }

    public void previous() {
        mController.playPre();
    }

    public void next() {
        mController.playNext();
    }

    public void collect() {
        mController.collectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
    }

    public void unCollect() {
        mController.unCollectAlbum(mController.getCurrentTrack().getAlbum().getAlbumId(), null);
    }

    public void searchAndPlayRadio(RadioSearchKey radioSearchKey) {
        // RadioSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
        // getRadioKeyWord()方法在文章最后面定义
        String keyword = getRadioKeyWord(radioSearchKey);
        mController.getSourseLists(keyword, 0, 1, 3, 1, new IMainDataCallback<SearchAlbumList>() {
            @Override
            public void successCallBack(SearchAlbumList searchAlbumList) {
                final List<Album> listAlbum = searchAlbumList.getAlbums();
                if (null == listAlbum || listAlbum.size() <= 0) {
                    return;
                }

                Album album = listAlbum.get(0);
                if (null == album) {
                    return;
                }

                mController.browseAlbums(album.getId(), 1, 50, new IMainDataCallback<CommonTrackList<Track>>() {
                    @Override
                    public void successCallBack(CommonTrackList<Track> trackCommonTrackList) {
                        mController.setPlayByAlbumTracks(trackCommonTrackList, 0, new IMainDataCallback<String>() {
                            @Override
                            public void successCallBack(String s) {
                            }

                            @Override
                            public void errCallBack(String s) {
                            }
                        });
                    }

                    @Override
                    public void errCallBack(String s) {
                    }
                });
            }

            @Override
            public void errCallBack(String s) {
            }
        });
    }
}

考拉

示例代码

public class KaoLaProxy {
    private Context mContext;
    private KLClientAPI mKLClient;

    public KaoLaProxy(Context context) {
        mContext = context;
        mKLClient = KLClientAPI.getInstance();
        mKLClient.init(context, KLClientAPI.KEY_AUTO);
    }

    public void openApp(boolean autoPlay) {
        mKLClient.launchApp(true);
    }

    public void exitApp() {
        mKLClient.exitApp();
    }

    public void play() {
        mKLClient.play();
    }

    public void pause() {
        mKLClient.pause();
    }

    public void previous() {
        mKLClient.playPre();
    }

    public void next() {
        mKLClient.playNext();
    }

    public void searchAndPlayRadio(RadioSearchKey radioSearchKey) {
        // RadioSearchKey是语义解析出来的结果,里面是key-value键值对,由思必驰sdk传给客户端
        // getRadioKeyWord()方法在文章最后面定义
        mKLClient.play(getRadioKeyWord(radioSearchKey), new PlayResult() {
            @Override
            public void onSuccuss() {
            }

            @Override
            public void onFailure(ErrorInfo errorInfo) {
            }
        });
    }
}

getMusicKeyWord和getRadioKeyWord方法

getMusicKeyWord

private String getMusicKeyWord(MusicSearchKey searchKey) {
        if (null == searchKey) {
            return "";
        }

        StringBuilder sb = new StringBuilder();

        if (!TextUtils.isEmpty(searchKey.getLanguage())) {
            if (searchKey.getLanguage().contains("歌")) {
                sb.append(searchKey.getLanguage());
            } else {
                sb.append(searchKey.getLanguage()).append("歌");
            }
        }

        if (!TextUtils.isEmpty(searchKey.getAlbum())) {
            sb.append(searchKey.getAlbum()).append("专辑");
        }

        if (!TextUtils.isEmpty(searchKey.getSingerSex())) {
            if (TextUtils.equals("男生", searchKey.getSingerSex())) {
                sb.append("男歌手");
            } else if (TextUtils.equals("女生", searchKey.getSingerSex())) {
                sb.append("女歌手");
            } else {
                sb.append(searchKey.getSingerSex());
            }
        }

        sb.append(searchKey.getMusicStyle())
                .append(searchKey.getSongName())
                .append(searchKey.getSingerName())
                .append(searchKey.getInstrument())
                .append(searchKey.getYears())
                .append(searchKey.getBoard())
                .append(searchKey.getAge())
                .append(searchKey.getCrowd())
                .append(searchKey.getMusicScene())
                .append(searchKey.getMusicType())
                .append(searchKey.getMusicSource())
                .append(searchKey.getTheme())
                .append(searchKey.getThemeSongType());

        String keyWord = sb.toString().trim();
        return keyWord;
    }

getRadioKeyWord

private String getRadioKeyWord(RadioSearchKey searchKey) {
        if (null == searchKey) {
            return "";
        }

        StringBuilder sb = new StringBuilder();

        sb.append(searchKey.getProgram())
                .append(searchKey.getSinger())
                .append(searchKey.getCategory())
                .append(searchKey.getObject())
                .append(searchKey.getColumn())
                .append(searchKey.getAnyTxt())
                .append(searchKey.getSerialNum())
                .append(searchKey.getCategory1())
                .append(searchKey.getCategory2())
                .append(searchKey.getColumn1())
                .append(searchKey.getColumn2())
                .append(searchKey.getPlayAction());

        String keyWord = sb.toString().trim();
        return keyWord;
    }

results matching ""

    No results matching ""